package com.wlj.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@Component
public class ContextWlj {

    private static final Integer JD = 0;

    @Autowired
    private static JedisPool jedisPool;
    /**
     * 上锁 使用redis 为分布式项目 加锁
     * @param sign
     * @param tiD
     * @return
     * @throws Exception
     */
    public static boolean lock(String sign, String tiD) {
        synchronized (JD) { // 加锁
            Jedis jedis = jedisPool.getResource();
            String uTid = jedis.get(sign);
            if (uTid == null) {
                //第三个参数: nxxx:
                // nx ： not exists, 只有key 不存在时才把key value set 到redis
                // xx ： is exists ，只有 key 存在是，才把key value set 到redis
                //第四个参数: expx: 过期时间单位
                //ex ： seconds 秒
                //px :  milliseconds 毫秒
                jedis.set(sign,tiD,"nx","ex",36);
                return true;
            }
            return false;
        }
    }

    /**
     * 锁验证
     * @param sign
     * @param tiD
     * @return
     */
    public static boolean checklock(String sign, String tiD){
        Jedis jedis = jedisPool.getResource();
        String uTid = jedis.get(sign);
        return tiD.equals(uTid);
    }

    /**
     * 去掉锁
     * @param sign
     * @param tiD
     */
    public static void clean(String sign, String tiD){
        if (checklock(sign, tiD)) {
            Jedis jedis = jedisPool.getResource();
            jedis.del(sign);
        }
    }

    /**
     * 获取摘要
     * @param
     * @return
     */
//    public static String getSign(HttpServletRequest request){
//        // 此工具是将 request中的请求内容 拼装成 key=value&key=value2 的形式 源码在线面
//        Map<String, String> map = SignUtil.getRequstMap(request);
//        String sign = null;
//        try {
//            // 这里使用md5方法生成摘要 SignUtil.getRequstMap 方法源码就不贴了
//            sign = SignUtil.buildRequest(map, SignType.MD5);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return sign;
//    }

    public static Map<String, String> getRequstMap(HttpServletRequest req){
        Map<String,String> params = new HashMap<>();
        //获取post 表单请求提交的参数
        Map<String, String[]> requestParams = req.getParameterMap();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            params.put(name, valueStr);
        }
        return params;
    }


 }
